import tkinter as tk
from tkinter import ttk, scrolledtext, filedialog, messagebox
import os

class NetConfigUI:
    def __init__(self, root, app_logic):
        self.root = root
        self.app_logic = app_logic
        self.root.title("Go2网络配置工具")
        self.root.geometry("480x800")
        self.root.resizable(False, False)
        
        # 设置字体
        self.large_font = ('Arial', 12)
        self.medium_font = ('Arial', 11)
        self.small_font = ('Arial', 9)
        self.mono_font = ('Courier', 10)  # 增大日志字体
        
        # 为tkinter控件设置默认字体
        self.root.option_add('*Font', self.medium_font)
        
        # 修改默认脚本文件名
        self.script_path = tk.StringVar(value="./auto_config.sh")
        self.target_interface = tk.StringVar()
        self.auto_mode = tk.BooleanVar(value=True)
        
        self.create_widgets()
        self.configure_styles()
        
    def create_widgets(self):
        """创建优化的小屏幕UI - 调整布局以适应800高度"""
        
        # 顶部状态栏 - 减小高度
        status_frame = ttk.Frame(self.root)
        status_frame.pack(fill="x", padx=8, pady=3)
        
        self.status_label = ttk.Label(
            status_frame,
            text="就绪",
            foreground='white',
            background='#4CAF50',
            padding=5,
            anchor='center'
        )
        self.status_label.pack(fill="x")
        
        # 配置选项区域 - 减小内边距
        config_frame = ttk.LabelFrame(self.root, text="配置选项", padding=6)
        config_frame.pack(fill="x", padx=8, pady=3)
        
        # 使用 tk.Checkbutton 而不是 ttk.Checkbutton
        auto_check = tk.Checkbutton(
            config_frame,
            text="自动模式（跳过所有确认）",
            variable=self.auto_mode,
            font=self.medium_font,
            bg='white',
            anchor='w'
        )
        auto_check.pack(fill="x", pady=3)
        
        # 网口选择行
        iface_frame = ttk.Frame(config_frame)
        iface_frame.pack(fill="x", pady=3)
        
        ttk.Label(iface_frame, text="目标网口:").pack(side="left")
        
        self.interface_combo = ttk.Combobox(
            iface_frame,
            textvariable=self.target_interface,
            width=18,
            state='readonly'
        )
        self.interface_combo.pack(side="left", padx=8, fill="x", expand=True)
        
        refresh_btn = ttk.Button(
            iface_frame,
            text="刷新",
            command=self.app_logic.check_interfaces,
            width=6
        )
        refresh_btn.pack(side="right")
        
        # 提示标签 - 减小字体
        ttk.Label(
            config_frame,
            text="提示: 仅显示 en* 和 eth* 网口",
            font=self.small_font,
            foreground='gray'
        ).pack(anchor="w", pady=(2, 0))
        
        # 脚本选择区域 - 减小内边距
        script_frame = ttk.LabelFrame(self.root, text="脚本选择", padding=6)
        script_frame.pack(fill="x", padx=8, pady=3)
        
        script_entry = ttk.Entry(
            script_frame,
            textvariable=self.script_path,
            state='readonly'
        )
        script_entry.pack(side="left", fill="x", expand=True, ipady=2)  # 减小输入框高度
        
        # 修复浏览按钮功能
        select_btn = ttk.Button(
            script_frame,
            text="浏览",
            command=self.select_script,  # 直接调用UI类的方法
            width=5
        )
        select_btn.pack(side="right", padx=(8, 0))
        
        # 输出区域 - 减小高度和内边距
        output_frame = ttk.LabelFrame(self.root, text="实时日志", padding=4)
        output_frame.pack(fill="both", expand=True, padx=8, pady=3)
        
        # 减小输出区域高度，为底部按钮腾出空间
        self.output_text = scrolledtext.ScrolledText(
            output_frame,
            font=self.mono_font,  # 使用更大的字体
            bg='black',
            fg='#00ff00',
            wrap=tk.WORD,
            padx=6,
            pady=6,
            height=12  # 明确设置高度为12行
        )
        self.output_text.pack(fill="both", expand=True)
        
        # 控制按钮区域 - 使用网格布局确保按钮大小均匀
        ctrl_frame = ttk.Frame(self.root, padding=6)
        ctrl_frame.pack(fill="x", padx=8, pady=8)  # 增加底部留白
        
        # 配置网格权重
        ctrl_frame.columnconfigure(0, weight=1)
        ctrl_frame.columnconfigure(1, weight=1)
        ctrl_frame.rowconfigure(0, weight=1)
        ctrl_frame.rowconfigure(1, weight=1)
        
        # 第一行按钮 - 减小按钮高度
        self.run_btn = ttk.Button(
            ctrl_frame,
            text="开始配置",
            command=self.app_logic.start_config
        )
        self.run_btn.grid(row=0, column=0, padx=4, pady=3, sticky="ew", ipady=6)  # 减小ipady
        
        self.exit_btn = ttk.Button(
            ctrl_frame,
            text="退出程序",
            command=self.app_logic.on_closing
        )
        self.exit_btn.grid(row=0, column=1, padx=4, pady=3, sticky="ew", ipady=6)
        
        # 第二行按钮
        self.restart_btn = ttk.Button(
            ctrl_frame,
            text="重启网络",
            command=self.app_logic.restart_network_interface
        )
        self.restart_btn.grid(row=1, column=0, padx=4, pady=3, sticky="ew", ipady=6)
        
        test_btn = ttk.Button(
            ctrl_frame,
            text="测试连接",
            command=self.app_logic.test_connection
        )
        test_btn.grid(row=1, column=1, padx=4, pady=3, sticky="ew", ipady=6)
        
        # 添加底部留白，确保按钮不被遮挡
        bottom_space = ttk.Frame(self.root, height=15)  # 增加底部留白高度
        bottom_space.pack(fill="x")
    
    def configure_styles(self):
        """配置控件样式"""
        style = ttk.Style()
        
        # 配置按钮样式
        style.configure('TButton', 
                       padding=(8, 6),  # 减小内边距
                       font=self.medium_font)
        
        # 配置标签样式
        style.configure('TLabel',
                       font=self.medium_font)
        
        # 配置组合框样式
        style.configure('TCombobox',
                       font=self.medium_font)
        
        # 配置输入框样式
        style.configure('TEntry',
                       font=self.medium_font)
        
        # 配置标签框架样式
        style.configure('TLabelframe.Label',
                       font=self.medium_font)
    
    def select_script(self):
        """选择脚本文件 - 直接在UI类中实现"""
        filename = filedialog.askopenfilename(
            title="选择配置脚本",
            filetypes=[("Shell脚本", "*.sh"), ("所有文件", "*.*")],
            initialdir="."
        )
        if filename:
            self.script_path.set(filename)
    
    def append_output(self, text):
        """追加输出到文本框"""
        self.output_text.insert(tk.END, text)
        self.output_text.see(tk.END)
    
    def clear_output(self):
        """清空输出"""
        self.output_text.delete(1.0, tk.END)
    
    def update_status(self, text, background='#4CAF50'):
        """更新状态标签"""
        self.status_label.config(text=text, background=background)
    
    def set_buttons_state(self, running=False):
        """设置按钮状态"""
        state = tk.DISABLED if running else tk.NORMAL
        self.run_btn.config(state=state)
        self.restart_btn.config(state=state)
        self.exit_btn.config(state=state)
    
    def get_config_values(self):
        """获取配置值"""
        return {
            'script_path': self.script_path.get(),
            'interface': self.target_interface.get(),
            'auto_mode': self.auto_mode.get()
        }
    
    def set_interfaces(self, interfaces):
        """设置网口列表"""
        self.interface_combo['values'] = interfaces
        if interfaces:
            self.target_interface.set(interfaces[0])
    
    def set_script_path(self, path):
        """设置脚本路径"""
        self.script_path.set(path)